#ifndef TCP_CLIENT
#define TCP_CLIENT

#include <bits/stdc++.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

using namespace std;

class tcpClient {
public:
    tcpClient() {
        m_clientfd = -1;
    };
    ~tcpClient() {};

    //向服务端发起连接请求
    bool connectServer(const std::string &in_ip, const unsigned short in_port) {
        // 第1步：创建客户端的socket。
        if ( (m_clientfd = socket(AF_INET,SOCK_STREAM,0))==-1) { 
            perror("connectServer socket create fail"); 
            return false; 
        }

        m_ip = in_ip;
        m_port = in_port;
        
        // 第2步：向服务器发起连接请求。
        struct hostent* h;
        // 指定服务端的ip地址。
        if ( (h = gethostbyname(in_ip.c_str())) == 0 )
        { 
            printf("connectServer gethostbyname failed.\n"); 
            close(m_clientfd); 
            return false; 
        }
        struct sockaddr_in servaddr;
        memset(&servaddr,0,sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(m_port); // 指定服务端的通信端口。
        memcpy(&servaddr.sin_addr,h->h_addr,h->h_length);
        // 向服务端发起连接清求。
        if (connect(m_clientfd, (struct sockaddr *)&servaddr,sizeof(servaddr)) != 0)
        { 
            perror("connectServer connect fail"); 
            close(m_clientfd); 
            return false; 
        }
    }
    
    //向服务端发送请求报文。
    bool sendMessage(const std::string &buffer) {
        if(m_clientfd == -1) {
            return false;
        }
        if (send(m_clientfd,buffer.c_str(),buffer.size(),0)<=0) {
            perror("send");
            return false;
        }

        return true;
    }

    bool recvMessage(std::string &buffer, const size_t maxlen) {
        buffer.clear();
        buffer.resize(maxlen);
        
        int readn = recv(m_clientfd, &buffer[0], maxlen, 0);

        if(readn < 0) {
            buffer.clear();
            return false;
        }
        buffer.resize(readn);

        return true;
    }

    int m_clientfd;
    std::string m_ip;       //IP或域名
    unsigned short m_port;  //16位的通信端口
};

#endif